#include <REGX52.H>
#include "type.h"
#include "clock.h"
#include "stopwatch.h"
#include "LCD1602.h"


// 设置时间模式变量用于记录当前模式 用于各功能判断
unsigned int timemode = CLOCK;
// 设置按钮操作标志位 若有操作则置1 用于快速返回的判断
unsigned char button_flag = 0;

extern time stopwatch;
extern unsigned char stopwatch_fake_pause;

// 设置全局变量Key1_Status用来存储Key1的状态
unsigned char Key_Status[4] = {1,1,1,1};


// 按键3 —— 无论什么时候都是用来切换状态用的
void Key3_Alter_Mode(){
	unsigned char* p = &stopwatch_fake_pause;
	// 快速返回 —— 如果在秒表/时钟状态下检测到有操作则直接返回时钟
	if(((timemode == STOPWATCH || timemode == ALARM) && (button_flag))){
		LCD_WriteCommand(0x01);
		timemode = CLOCK;		
		button_flag = 0;
		// 快速返回时停止假暂停
		*p = 0;
	}
	// 正常切换 —— 没有操作则直接进入下一个
	else{
		LCD_WriteCommand(0x01);
		timemode++;
		timemode %= 4;
	}
	// 切换之后立刻显示新的界面
	LCD_ShowTime();
}

void KeyCheck(){
	// 起始未按下 用于存储按键状态的变量keybuf 最开始置全1
	static unsigned char keybuf[4] = {0xFF,0xFF,0xFF,0xFF};
	int i = 0;
	unsigned int* p = &timemode;
	// 每次将新检测到的Key1状态存储到最低位
	keybuf[0] = (keybuf[0] << 1) | Key1;
	keybuf[1] = (keybuf[1] << 1) | Key2;
	keybuf[2] = (keybuf[2] << 1) | Key3;
	keybuf[3] = (keybuf[3] << 1) | Key4;
	for( i = 0 ; i < 4; i++){
				// 当keybuf为全0时，可得按键被按下
		if(keybuf[i] == 0x00){
			// 检测之前是否为高电平
			if(Key_Status[i]){
				switch(i){
					
					// 当 Key1(START) 被按下时
					case START:
						// 当前状态不为时钟的时候检测是否有操作
						button_flag = timemode ? 1 : 0;
					
						// 检测当前模式
						switch(timemode){
							case CLOCK:
							// 若为时钟模式
								clock_Key1();
								break;
							// 若为秒表模式
							case STOPWATCH:
								stopwatch_Key1();
								break;
							// 若为闹钟模式
							case ALARM:
								alarm_Key1();
								break;
							case SET:
								set_Key1();
								break;
							default:
								break;
						}
					break;
						
					// 当 Key2(RESET) 被按下时
					case RESET:
						// 当前状态不为时钟的时候检测是否有操作
						button_flag = timemode ? 1 : 0;
					
						// 检测当前模式
						switch(timemode){
							// 若为时钟模式
							case CLOCK:
								clock_Key2();
								break;
							// 若为秒表模式
							case STOPWATCH:
								stopwatch_Key2();
								break;
							// 若为闹钟模式
							case ALARM:
								alarm_Key2();
								break;
							case SET:
								set_Key2();
								break;
							default:
								break;
						}
					break;
						
					// 当 Key3(MODE) 被按下时 —— 该键只有切换模式的功能
					case MODE:
						Key3_Alter_Mode();
					break;
						
					// 当 Key4(DAIDING) 被按下时 —— 待定 还未想好功能（原为打开冷光灯）
					case DAIDING:
					// 关闭闹钟
						stop_alarm();	
					
						// 检测当前模式
						switch(timemode){
							// 若为时钟模式
							case CLOCK:
								break;
							// 若为秒表模式
							case STOPWATCH:
								break;
							// 若为闹钟模式
							case ALARM:
								break;
							case SET:
								set_Key4();
								break;
							default:
								break;
						}
					break;
				}
			}
			// 并将按键引脚状态设置为0
			Key_Status[i] = 0;
		}
		
		// 当keybuf为全1时，可得此时已经松手
		if(keybuf[i] == 0xFF){
			// 则将按键引脚状态设置为1
			Key_Status[i] = 1;
		}
	}
}

